import { ID_INDEX, ID } from './interface';

/**
 * 打开并创建数据库和表
 * @param dbName
 * @param storeName
 * @param version
 * @returns
 */
export function openDB(dbName, storeName, version = 1) {
  return new Promise((resolve, reject) => {
    const indexDB = window.indexedDB;
    let db;
    const request = indexDB.open(dbName, version);
    // 打开数据库成功
    request.onsuccess = function (event) {
      db = event.target.result; // 数据库对象
      resolve(db);
    };

    // 打开数据库失败
    request.onerror = function (event) {
      reject(event);
    };

    request.onupgradeneeded = function (event) {
      // 数据库创建或升级的时候会触发
      db = event.target.result; // 数据库对象
      let objectStore;
      if (!db.objectStoreNames.contains(storeName)) {
        objectStore = db.createObjectStore(storeName, { keyPath: 'id' }); // 创建表
        //   创建索引，在后面查询数据的时候可以根据索引查
        //   第二参数需要和数据中的某一个字段名一直，例如：id
        objectStore.createIndex(ID_INDEX, ID, { unique: true });
      }
    };
  });
}


/**
 * 初始化所有的表
 * @param { string} dbName
 * @param { Array } storeNames
 * @param { number } version
 * @returns
 */
export function initDBAll(dbName, storeNames, version = 1) {
  return new Promise((resolve, reject) => {
    const indexDB = window.indexedDB;
    const request = indexDB.open(dbName, version);
    // 打开数据库成功
    request.onsuccess = function (event) {
     const db = event.target.result; // 数据库对象
      resolve(db);
      console.log('数据库打开成功！！！！！')
    };

    // 打开数据库失败
    request.onerror = function (event) {
      console.log('数据库打开失败！！！！！')
      reject(event);
    };

    request.onupgradeneeded = function (event) {
      // 数据库创建或升级的时候会触发
     const db = event.target.result; // 数据库对象
      
      storeNames.forEach((storeName)=>{
        if (!db.objectStoreNames.contains(storeName)) {
          const objectStore = db.createObjectStore(storeName, { keyPath: 'id' }); // 创建表
          //   创建索引，在后面查询数据的时候可以根据索引查
          //   第二参数需要和数据中的某一个字段名一直，例如：id
          objectStore.createIndex(ID_INDEX, ID, { unique: true });
        }

      })
    };
  });
}





